练习

(1)“使用 Trace.WriteLine() 要优于使用 Debug.WriteLine(),因为调试版本仅能用于调试程序。” 这个观点正确吗?为什么?

答案:   这个语句仅要用于所有版本的信息有效。而且,我们常常希望仅在使用调试版本时输出调试信息。此时应首选Debug.WriteLine()版本。

(2)为一个简单的应用程序编写代码,其中包含一个循环,该循环在运行 5000 次后产生一个错误。使用断点在第 5000 次循环出现错误前进入中断模式(注意产生错误的一种简单方式是视图访问一个不存在的数组元素,例如在一个有 100 个元素的数组中,访问 myArray[1000])。

答案:

    static void Main(string[] args)
    {
        for(int i = 1; i < 10000; i++)
        {
            Console.WriteLine("Loop cycle {0}", i);
            if(i == 5000)
            {
                Console.WriteLine(args[999]);
            }
        }
    }

  在VS中,可以把断点方在下面的代码行上:

    Console.WriteLine("Loop cycle {0}", i);

  应修改断点的属性,把执行次数的条件设置为“执行次数等于5000时中断”。

(3)“只有在不执行 catch 块的情况下,才执行 finally 代码块”,对吗?

答案:错误,finally块始终会执行,它可能在处理catch块之后执行。

(4)下面定义了一个枚举数据类型 orientation。编写一个应用程序,使用结构化异常处理(SEH)将 byte 类型的变量安全地强制转换为 orientation 类型变量。注意,可使用 checked 关键字强制抛出异常,下面是一个示例。在你编写的应用程序中应该使用这段代码:

        enum Orientation : byte
        {
            North = 1,
            South = 2,
            East = 3,
            West = 4
        }
        myDirection = checked((Orientation)myByte);

答案:

    static void Main(string[] args)
    {
        Orientation myDirection;
        for(byte myByte = 2; myByte < 10; myByte++)
        {
            try
            {
                myDirection = checkd((Orientation)myByte);
                if((myDirection < Orientation.North) || (myDirection > Orientation.West))
                {
                    throw new ArgumentOutOfRangeException("myByte", myByte, "Value must be between 1 and 4");
                }
            }
            cath(ArgumentOutOfRangeException e)
            {
                // If this section is reached then myByte < 1 or myByte > 4.
                Console.WriteLine("e.Message");
                Console.WriteLine("Assigning default value, Orientation.North.");
                myDirection = Orientation.North;
            }
            Console.WriteLine("myDirection = {0}", myDirection);
        }
    }

  注意这是一个小问题。因为枚举基于byte类型,所以可以给其赋予任意byte值,即使在枚举中没有为该值指定名称也同样如此。在上面的代码中,如有必要,可以生成自己的异常。

🔚